package br.edu.senai.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class Conexao {

    private EntityManagerFactory factory;
    private EntityManager em;
    private boolean conectou = false;
    private static final String PU = "AlmoxarifadoPU";

    public Conexao() {
        conectar();
    }

    public boolean conectar() {
        if (!conectou) {
            try {
                factory = Persistence.createEntityManagerFactory(PU);
                em = factory.createEntityManager();
                conectou = true;
            } catch (Exception ex) {
                System.out.println("Não foi possível conectar ao banco de dados\n" + ex.getMessage());
            }
            return conectou;
        } else {
            return true;
        }
    }

    public void desconectar() {
        try {
            em.close();
            factory.close();
            conectou = false;
        } catch (Exception ex) {
            System.out.println("Ocorreu um erro ao tentar se desconectar do banco de dados" + ex.getMessage());
        }
    }

    //salva um novo objeto
    public void incluir(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.persist(o);
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    //salva as alterações feitas em um objeto
    //já existente
    public void alterar(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.merge(o);
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    //exclui um objeto existente no banco
    public void excluir(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.remove(em.merge(o));
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    //retorna o entityManager
    public EntityManager getEm() {
        if (!conectou) {
            conectar();
        }
        return em;
    }
}
